<?php

//error_reporting(E_ALL);
//ini_set('display_errors','On');

use Doctrine\Common\Collections\ArrayCollection;

class Usuarios_BusquedaController extends Zend_Controller_Action {

    private $_personaDao;
    private $_creditoDao;
    private $_permisoDao;
    private $_referenciaDao;
    private $_movimientoDao;
    private $_juicioDao;

    public function init() {

        $this->_flashMessenger = $this->_helper->FlashMessenger;
        $this->_permisoDao = new Doctrine_Model_PermisoDao();

        $auth = Zend_Auth::getInstance();
        if ($auth->hasIdentity()) {
            if (!empty($auth->getIdentity()->id)) {
                $usuarioDao = new Doctrine_Model_UsuariosDoctrineDao();
                $this->view->usuario = $usuarioDao->obtenerPorId($auth->getIdentity()->id);
            }
        } else {
            $this->_helper->redirector('index', 'login', 'admin');
        }

        /* Colores */
        $colores = array(
            '5b92d6' => array('5b92d6', '8fbaef'), //azul
            'd6d65b' => array('d6d65b', 'bfbf3f'), //amarillo
            '51ad56' => array('51ad56', '73be78'), //verde
            'db6f70' => array('db6f70', 'e59899'), //rojo
            '5e71a0' => array('5e71a0', '8e9cbc'), //azul oscuro
            'd68e5b' => array('d68e5b', 'e8a97c'), //naranja
            '92989f' => array('92989f', 'bbbec3')); //gris
        $this->view->colorSucursal = $colores[$this->view->usuario->getSucursal()->getColor()];
        /* Colores */

        $this->referenciaDao = new Doctrine_Model_Referencias();
        $this->_personaDao = new Doctrine_Model_PersonaDao();

        $this->_creditoDao = new Doctrine_Model_CreditoDao();
        $this->_referenciaDao = new Doctrine_Model_ReferenciasDoctrineDao();
        $this->_movimientoDao = new Doctrine_Model_MovimientoDao();
        $this->_juicioDao = new Doctrine_Model_JuicioDao();

        $this->view->mensajes = $this->_flashMessenger->getMessages();


        $this->view->headScript()->appendFile($this->view->baseUrl() . '/js/credito_registrar.js');
    }

    public function personaAction() {

        $this->view->titulo = "B&uacute;squeda R&aacute;pida";

        $nro_documento = $this->getRequest()->getParam("b_nro_documento") ? $this->getRequest()->getParam("b_nro_documento") : null;
        $apellido = $this->getRequest()->getParam("b_apellido") ? $this->getRequest()->getParam("b_apellido") : null;
        $nombres = $this->getRequest()->getParam("b_nombres") ? $this->getRequest()->getParam("b_nombres") : null;
        $cliente_id = $this->getRequest()->getParam("b_cliente_id", null);
        $credito_id = $this->getRequest()->getParam("credito_id", 0);
        $telefono = $this->getRequest()->getParam("b_telefono", null);
        $nro_credito = $this->getRequest()->getParam("b_nro_credito", null);
        $nro_juicio = $this->getRequest()->getParam("b_nro_juicio", null);
        
        $yaBuscado = null;
        $conjuntoClientes = array();
        if ($cliente_id) {
            $conjuntoClientes[] = $this->_personaDao->obtenerPorId($cliente_id);
            $this->view->genere_credito = true;
            $yaBuscado = false;
        } else {
            if ($nro_credito) {
                $creditos = $this->_creditoDao->obtenerPorNroCredito($nro_credito);
                if (count($creditos)) {
                    if ($creditos[0]->getUsuario()->getSucursal()->getId() == $this->view->usuario->getSucursal()->getId())
                        $conjuntoClientes[] = $creditos[0]->getCliente();
                }
            }
            if ($nro_documento) {
                $conjuntoClientes = $this->_personaDao->obtenerPorNroDocumento($nro_documento);
            }
            if ($apellido && $nombres) {
                $conjuntoClientes = $this->_personaDao->obtenerPorNombreApellido($nombres, $apellido);
                $yaBuscado = true;
            }
            if (!$yaBuscado) {
                if ($apellido) {
                    $conjuntoClientes = $this->_personaDao->obtenerPorApellido($apellido);
                }
                if ($nombres) {
                    $conjuntoClientes = $this->_personaDao->obtenerPorNombres($nombres);
                }
            }
            if ($telefono) {
                $conjuntoClientes = $this->_personaDao->obtenerPorTelefono($telefono);
            }
            if ($nro_juicio):
                $juicio = $this->_juicioDao->obtenerPorId($nro_juicio);
                if ($juicio):
                    $conjuntoClientes[] = $juicio->getCliente();
                endif;
            endif;
        }

        if (empty($nro_credito) && empty($nro_documento) && empty($apellido) && empty($nombres) && empty($telefono) && empty($nro_juicio)) {
            if ($this->view->usuario->getSucursal()->getNegocio()) {
                $conjuntoClientes = $this->_personaDao->obtenerUltimosConCreditosActivosPorSucursal($this->view->usuario->getSucursal()->getId());
            } else {
                $conjuntoClientes = $this->_personaDao->obtenerUltimosConCreditosActivos();
            }
        }

        /* parameters */
        $this->view->b_nro_credito = $nro_credito;
        $this->view->b_nro_documento = $nro_documento;
        $this->view->b_apellido = $apellido;
        $this->view->b_nombres = $nombres;
        $this->view->b_telefono = $telefono;
        $this->view->b_nro_juicio = $nro_juicio;
        $this->view->credito_id = $credito_id;
        $this->view->personas = $conjuntoClientes;

        $this->view->acccion_destino = $this->getRequest()->getParam("acccion_destino");
    }

    public function obternerdatospersonaAction() {
        // este parametro es para volver a la confeccion del credito
        $this->view->volver_a_registrar_como_garante = $this->getRequest()->getParam("volver_a_registrar_como_garante");

        if ($this->_hasParam("persona_id") && $this->getRequest()->getParam("persona_id")) :
            $id = $this->getRequest()->getParam("persona_id");
            $unaPersona = new Doctrine_Model_Entities_Persona();
            $unaPersona = $this->_personaDao->obtenerPorId($id);

            $this->view->cliente = $unaPersona;
            $this->view->juicios = $this->_juicioDao->obtenerPorCliente($unaPersona->getId());

            if ($unaPersona) {
                $garante = $unaPersona->obtenerUltimoGaranteAsociado();
                if ($garante) {
                    $this->view->garante_id = $garante->getId();
                }
            }

            $creditos = $this->_creditoDao->obtenerTodosPorPersonaOrdenadoPorEstado($unaPersona->getId());
            $creditosPropios = new ArrayCollection();
            $creditosDeOtraSucursales = new ArrayCollection();

            /* CREDITOS ACTIVOS */
            foreach ($creditos as $credito) {
                if ($this->view->usuario->getSucursal()->getId() == $credito->getUsuario()->getSucursal()->getId()) {
                    if ($credito->getSaldo()) {
                        $creditosPropios->add($credito);
                    }
                } else {
                    if ($credito->getSaldo()) {
                        $creditosDeOtraSucursales->add($credito);
                    }
                }
            }

            /* CREDITOS CANCELADOS */
            foreach ($creditos as $credito) {
                if ($this->view->usuario->getSucursal()->getId() == $credito->getUsuario()->getSucursal()->getId()) {
                    if (!$credito->getSaldo()) {
                        $creditosPropios->add($credito);
                    }
                } else {
                    if (!$credito->getSaldo()) {
                        $creditosDeOtraSucursales->add($credito);
                    }
                }
            }

            $this->view->creditosPropios = $creditosPropios;
            $this->view->creditosDeOtraSucursales = $creditosDeOtraSucursales;
            $this->view->tiposDeCreditosPosibles = $unaPersona->obtenerTiposDeCreditosParaSolicitar();
        else:
            $this->_flashMessenger->addMessage(array("error" => "No existe la persona."));
            $this->_helper->redirector('persona', 'busqueda', 'usuarios');
        endif;
    }

    public function obtenercreditoAction() {

        $this->view->apto_renovar = false;

        //parametros provenientes de anular pagos
        $this->view->error = $this->getRequest()->getParam('error');
        $this->view->mensaje = $this->getRequest()->getParam('mensaje');

        $this->view->headScript()->appendFile($this->view->baseUrl() . '/js/tooltips/jquery.poshytip.js');
        $this->view->headLink()->appendStylesheet($this->view->baseUrl() . '/js/tooltips/tip-yellowsimple/tip-yellowsimple.css');

        if ($this->_hasParam("credito_id")) {
            $id = $this->getRequest()->getParam("credito_id");

            $credito = new Doctrine_Model_Entities_Credito();
            $credito = $this->_creditoDao->obtenerPorId($id);
            $cliente = $credito->getCliente();
            if ($cliente) {
                $cliente_id = $cliente->getId();
                if ($credito->estasAptoARenovar()) {
                    $this->view->apto_renovar = true;
                }
                $this->view->cliente_id = $cliente_id;
            }

            $cuotas = $credito->getCuotas();

            $this->view->cuotas = $cuotas;
            $this->view->credito_id = $id;

            if ($credito->getGarante()) {
                $this->view->garante_id = $credito->getGarante()->getId();
                $this->view->garante_en_mora = $credito->getGarante()->estoyEnMora();
            }

            if ($cliente && empty($this->view->garante_en_mora)) {
                $garantesAsociados = $cliente->obtenerTodosLosGarantesAsociados();
                foreach ($garantesAsociados as $garanteAsociado) {
                    $garanteEnMora = $garanteAsociado->estoyEnMora();
                    if ($garanteEnMora) {
                        $this->view->garante_id = $garanteAsociado->getId();
                        $this->view->garante_en_mora = $garanteAsociado->estoyEnMora();
                    }
                }
            }

            $this->view->cliente_id = $cliente_id;
            $this->view->saldo_total = $credito->getSaldo();
            $this->view->unCliente = $cliente;
            $this->view->credito_facturado = $credito->getFacturado();
        }

    }

    public function cobrarAction() {

        $datos = $this->getRequest()->getParams();
        $montoApagar = $datos['monto_a_pagar'];
        $numerosDeCuotas = array();
        $pagoAcuenta = false;
        $pagosRealizadosIds = Array();
        $conjCuotasPagas = Array();
        $cuotasACuenta = Array();
        $pagosRealizados = new ArrayCollection();
        if (isset($datos['credito_id']) && !empty($datos['credito_id'])) {
            $credito = $this->_creditoDao->obtenerPorId($datos['credito_id']);
        }

        if (!empty($montoApagar) && $montoApagar > 0) {
            if ($this->getRequest()->isPost()) {


                $cuotasPagas = array(); //para los movimientos individuales
                //arreglo para cuando el sistema se vueleve loco y hace pagos dobles!
                $idsCuotasParaPagar = $datos['cuotas'];
                $idsSinIntereses = $datos['sin_intereses'];
                $idsCuotasParaPagar = array_unique($idsCuotasParaPagar);
                $idsCuotasSinIntereses = array_unique($idsSinIntereses);
                $j = 0;
                foreach ($idsCuotasParaPagar as $idCuota) {
                    $cuota = $credito->obtenerCuotaPorId($idCuota);

                    //agregado para el plan variable
                    $saldo = $cuota->getSaldo();
                    if ($cuota->getCredito()->planVariable()) {
                        $hoy = new DateTime();
                        $fechaDeControlDeMora = new DateTime($cuota->getVencimiento()->format("Y-m-d"));
                        if ($hoy->format('d') < 11 && $fechaDeControlDeMora->format('m') == $hoy->format('m') && !$cuota->estoySaldada()) {
                            $saldo = $cuota->getMontoOriginal();
                        }
                    }

                    $pago = new Doctrine_Model_Entities_Pago();
                    $pago->setInteresesHastaEseMomento($cuota->getIntereses());
                    $pago->setMoraHastaEseMomento($cuota->getMora());
                    if (in_array($idCuota, $idsSinIntereses)) {
                        $noCobraIntereses = true;
                        $interesesADescontar = $cuota->getIntereses();
                    } else {
                        $noCobraIntereses = false;
                    }
                    $montoCuota = $this->getRequest()->getParam('monto' . $idCuota, 0);
                    $pago->setCuota($cuota);
                    $pago->setMonto($montoCuota);
                    if ($noCobraIntereses) {
                        // $pago->setMonto($montoCuota - $cuota->getIntereses());
                        $pago->setMonto($montoCuota);
                        $pago->setGeneraMovimientoIntereses(1);
                        $pago->setInteresesCobrados(0);
                        $pago->setInteresesNoCobrados($cuota->getIntereses());
                    } else {
                        $pago->setMonto($montoCuota);

//                        Esta es una logica que hice en su moento para los pagos a cuenta con y sin intereses y se vayan sumando 
//                        anda bien pero ahora no lo entiendo ahora..

                        if ($cuota->getIntereses() > 0 || $cuota->getInteresesNoCobradosEnLaUltimaCuota() > 0) {
                            $a = $cuota->getIntereses();
                            if ($montoCuota >= $cuota->getIntereses() && $cuota->getIntereses() > 0) {
                                $pago->setInteresesCobrados($cuota->getIntereses());

                                $pago->setInteresesNoCobrados(0);
                            } else {
                                if ($cuota->getInteresesNoCobradosEnLaUltimaCuota() > 0) {
                                    if ($montoCuota == $saldo) {
                                        $pago->setInteresesCobrados($cuota->getInteresesNoCobradosEnLaUltimaCuota());
                                        $pago->setInteresesNoCobrados(0);
                                    } else {
                                        $pago->setInteresesCobrados($montoCuota);
                                        $pago->setInteresesNoCobrados(abs(($cuota->getIntereses() + $cuota->getInteresesNoCobradosEnLaUltimaCuota()) - $montoCuota));
                                    }
                                } else {
                                    $pago->setInteresesCobrados($montoCuota);
                                    $pago->setInteresesNoCobrados(abs($cuota->getIntereses() - $montoCuota));
                                }
                            }
                        } else {
                            $pago->setInteresesCobrados(0);
                            $pago->setInteresesNoCobrados(0);
                        }
//                        FIN
                    }

                    $pago->setDiasDeMora($cuota->getMora());

                    $pago->setFecha(new DateTime());
                    $pago->setUsuario($this->view->usuario);
                    $pago->setFechaVencimientoCuota($cuota->getVencimiento());

                    $cuota->setMonto($saldo - ($montoCuota));

                    $hoy = new DateTime();

                    $cuota->setVencimiento(new DateTime());
                    $cuota->agregarPago($pago);
                    $numerosDeCuotas[] = $cuota->getNumeroDeCuota();
                    $pagosRealizados->add($pago);
                    if ($cuota->getMonto() > 0) {
                        $pagoAcuenta = true;
                        $cuotasACuenta[] = $cuota->getId();
                    }
                    $cuotasPagas[$j] = array('nro_cuota' => $cuota->getNumeroDeCuota(), 'monto' => $pago->getMonto(), 'pago_a_cuenta' => $pagoAcuenta);
                    $conjCuotasPagas[] = $cuota;
                    $j++;
                }
                if (count($credito->obtenerCuotasImpagas()) == 0) {
                    $EstadoSaldado = Doctrine_Model_Referencias::obtenerPorId('Doctrine_Model_Entities_EstadoCredito', 2);
                    $credito->setEstado($EstadoSaldado);
                    $credito->setFechaCancelado(new DateTime());
                }
                if ($this->_creditoDao->guardar($credito)) {

                    foreach ($cuotasPagas as $key => $cuotaPaga) {
                        $movimiento = new Doctrine_Model_Entities_Entrada();
                        $apellidoYNombres = $credito->getCliente()->getApellido() . ', ' . $credito->getCliente()->getNombres();
                        $apellidoYNombres = substr($apellidoYNombres, 0, 22);
                        $movimiento->setDescripcion(" " . $apellidoYNombres . " CRE N&#176;:" . $credito->getNumero() . " (" . $cuotaPaga['nro_cuota'] . ")");
                        $movimiento->setMonto($cuotaPaga['monto']);
                        if ($cuotaPaga['pago_a_cuenta']) {
                            $movimiento->setCategoria($this->_referenciaDao->obtenerPorId('Doctrine_Model_Entities_CategoriaMovimiento', 6));
                        } else {
                            $movimiento->setCategoria($this->_referenciaDao->obtenerPorId('Doctrine_Model_Entities_CategoriaMovimiento', 1));
                        }

                        $movimiento->setUsuario($this->view->usuario);
                        $movimiento->setCuota_id($idCuota);
                        $this->_movimientoDao->guardar($movimiento);

                        if ($noCobraIntereses) {
                            $movimiento = new Doctrine_Model_Entities_Entrada();
                            $movimiento->setCategoria($this->_referenciaDao->obtenerPorId('Doctrine_Model_Entities_CategoriaMovimiento', 1));
                            $movimiento->setDescripcion(" " . $apellidoYNombres . " CRE N&#176;:" . $credito->getNumero() . " (" . $cuotaPaga['nro_cuota'] . ")");
                            $movimiento->setMonto(-$interesesADescontar);
                            $movimiento->setUsuario($this->view->usuario);
                            $movimiento->setCuota_id($idCuota);
                            $this->_movimientoDao->guardar($movimiento);
                        }
                    }
                    ////para ver si puede renovar
                    $tiposDeCreditosPosibles = $credito->getCliente()->obtenerTiposDeCreditosParaSolicitar();
                    foreach ($tiposDeCreditosPosibles as $tipoDeCredito) {
                        if ($tipoDeCredito->soyRenovado()) {
                            $this->view->apto_renovar = true;
                        }
                    }
                    //fin para saber si puede renovar
                    $this->view->error = false;
                    $this->view->mensaje = "Pagos registrados con exito!";
                    $this->view->pagos = $pagosRealizados;
                    $this->view->noCobraIntereses = $noCobraIntereses;
                    $this->view->interesesADescontar = $interesesADescontar;


                    foreach ($pagosRealizados as $p) {
                        $pagosRealizadosIds[] = $p->getId();
                    }
                } else {
                    $this->view->error = true;
                    $this->view->mensaje = "Problemas al intentar registrar los pagos";
                }
            }
        } else {
            $this->view->error = true;
            $this->view->mensaje = "Problemas al intentar registrar los pagos";
            $this->_helper->redirector("obtenercredito", "busqueda", "usuarios", array("credito_id" => $datos['credito_id']));
        }

        $this->view->credito = $credito;
        $this->view->conjCuotasPagas = $conjCuotasPagas;
        $ctas = array();
        foreach ($conjCuotasPagas as $cta) {
            $ctas[] = $cta->getId();
        }
        $this->view->conjCuotasPagas = implode(",", $ctas);

        $this->view->credito_id = $datos['credito_id'];
        $this->view->cuotas_id = implode(",", $idsCuotasParaPagar);
        $this->view->pagos_ids = implode(",", $pagosRealizadosIds);
        $this->view->cuotasACuentaIds = implode(",", $cuotasACuenta);
        ;
        $this->view->cuotas_sin_intereses_ids = implode(",", $idsCuotasSinIntereses);
        if ($credito) {
            $this->view->cliente_id = $credito->getCliente()->getId();
        }
        $this->_helper->redirector("impresioncomprobantes", "credito", "usuarios", array("credito_id" => $datos['credito_id'], "cliente_id" => $this->view->cliente_id, "cuotas_id" => $this->view->cuotas_id, "pagos_ids" => $this->view->pagos_ids, "conjCuotasPagas" => $this->view->conjCuotasPagas, "apto_renovar" => $this->view->apto_renovar, "noCobraIntereses" => $this->view->noCobraIntereses, "interesesADescontar" => $this->view->interesesADescontar, "cuotas_sin_intereses_ids" => $this->view->cuotas_sin_intereses_ids, "cuotas_a_cuenta" => $this->view->cuotasACuentaIds));
    }

    public function verdatoslaboralesAction() {
        $this->_helper->layout()->setLayout("layout_pagos");

        if ($this->_hasParam("cliente_id")) :
            $id = $this->getRequest()->getParam("cliente_id");
            $unaPersona = new Doctrine_Model_Entities_Persona();
            $unaPersona = $this->_personaDao->obtenerPorId($id);

            $this->view->datosLaborales = $unaPersona->getDatosLaborales();

        endif;
    }

    public function vergaranteAction() {
        $this->_helper->layout()->setLayout("layout_pagos");


        if ($this->_hasParam("credito_id")) :
            $id = $this->getRequest()->getParam("credito_id");
            $unCredito = new Doctrine_Model_Entities_Credito();
            $unCredito = $this->_creditoDao->obtenerPorId($id);


            $this->view->garante = $unCredito->getGarante();


        endif;
    }

    public function verclienteAction() {
        $this->_helper->layout()->setLayout("layout_pagos");


        if ($this->_hasParam("credito_id")) :
            $id = $this->getRequest()->getParam("credito_id");
            $unCredito = new Doctrine_Model_Entities_Credito();
            $unCredito = $this->_creditoDao->obtenerPorId($id);


            $this->view->garante = $unCredito->getCliente();


        endif;
    }

}
